#include <my_header.h>
// 映射5个字节的文件内容到用户空间中，并演示了一下
// 随机访问以及随机修改。
/* Usage: ./1_mmap_munmmap filename */
int main(int argc, char *argv[]){                                  
    ARGS_CHECK(argc, 2);
    // 以读写模式打开文件
    int fd = open(argv[1], O_RDWR);
    ERROR_CHECK(fd, 1, "open");

    // 调整文件大小为5字节
    int ret = ftruncate(fd, 5);
    ERROR_CHECK(ret, -1, "ftruncate");

    // 将文件映射到内存中，映射大小为5字节，允许读写，共享映射
    char *p = (char *)mmap(NULL, 5, PROT_READ | PROT_WRITE,
                           MAP_SHARED, fd, 0);
    ERROR_CHECK(p, MAP_FAILED, "mmap");
   
    // 随机访问文件内容
    for(int i=0; i<5; i++)
    {
        printf("%c", p[i]);
    }
    printf("\n");

    // 随机修改文件内容
    p[4] = '0';

    printf("-------------------------------------\n");
    // 再次随机访问文件内容
    for(int i=0; i<5; i++)
    {
        printf("%c", p[i]);
    }
    printf("\n");

    // 先开后关，后开先关
    // 先解除内存映射，再关闭文件描述符
    munmap(p, 5);
    //关闭文件描述符
    close(fd);
    return 0;
}


